var utils = {
    /**
     * 获取非内联样式
     * @param {DOMobject} obj 要获取的属性的DOM对象
     * @param {string} attr   要获取的属性名
     * @return {string} String attr的样式值
     */

    getstyle(obj,attr){
        if(obj.currentStyle){
            return obj.currentStyle[attr]
        }else{
            return getComputedStyle(obj,false)[attr]
        }
    },

    /**
     * 设置监听
     * @param {DOMobject} obj 要设置监听的对象 
     * @param {string} type   设置的事件类型 
     * @param {function} fn   监听的函数事件 
     * @param {boolean} iscaptrue 设置事件是捕获还是冒泡
     */

    on (obj,type,fn,iscaptrue){
        if(iscaptrue == undefined) iscaptrue = false
        if(window.attachEvent){
            obj.attachEvent('on'+type,fn)
        }else{
            obj.addEventListener(type,fn,iscaptrue)
        }
    },

    /**
     * 移除监听
     * @param {DOMobject} obj 要设置监听的对象 
     * @param {string} type   设置的事件类型 
     * @param {function} fn   监听的函数事件 
     * @param {boolean} iscaptrue 设置事件是捕获还是冒泡
     */

    off (obj,type,fn,iscaptrue){
        if(iscaptrue == undefined) iscaptrue = false
        if(window.detachEvent){
            obj.detachEvent('on'+type,fn)
        }else{
            obj.removeEventListener(type,fn,iscaptrue)
        }
    },

    /**
     * 匀速运动
     * @param {DOMobject} ele 设置要运动的对象 
     * @param {string} attr   设置运动的属性名
     * @param {number} end    设置运动的终点值 单位px
     * @param {number} turation 运动所需要的总事件 ms 
     * @param {function} fn   运动结束后，所进行的操作（回调函数）
     */

    move(ele,attr,end,turation,fn){
        // 获取开始坐标值
        var start = parseInt(utils.getstyle(ele,attr))
        //获取一共要运动的距离
        var distance = end - start  
        // 获取定时器要运动多少次
        var steps = parseInt(turation / 20)  
        // 获取每一步的速度
        var speed = distance / steps
        clearInterval(ele.timer)
        // 开始运动
        var n = 0
    ele.timer =  setInterval(function(){
            n++
            ele.style[attr] = start + n*speed + 'px'
            if(n==steps){
                ele.style[attr] = end+'px'
                clearInterval(ele.timer)
                fn && fn()
            }
        },20) 
    },
    /**
     * 缓冲运动
     * @param {DOMObject} ele 作用的对象 
     * @param {string} attr   操作的属性名
     * @param {number} end    终点值 
     * @param {function} fn   运动结束后的回调函数
     */
    bfmove(ele,attr,end,fn){
        //获取最初的位置
        var strat = parseInt(utils.getstyle(ele,attr))
        //清除前一次的定时器
        clearInterval(ele.timer)
        ele.timer = setInterval(function(){
            // 获取实时的路程距离
            var distance = end-strat
            // 获取实时距离的1/10
            var speed = distance>0 ? Math.ceil(distance / 10) : Math.floor(distance / 10)
            // console.log(speed) 
            // 得到已经运动的距离
            strat += speed
            ele.style[attr] = strat + 'px'
            if(strat == end){
                clearInterval(ele.timer)
                fn && fn()
            }
        },20)
    },

    /**
     * 获取盒子到body 的距离
     * @param {DOMobject} ele 获取坐标的元素
     * @return {Object}  得到坐标值
     */
    getBodyPos(ele){
        var left = 0,top = 0;
        while(ele.offsetParent){
            left += ele.offsetLeft + ele.clientLeft
            top += ele.offsetTop + ele.clientTop
            ele = ele.offsetParent
        }
        return {left,top}
    }
    
}